﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CREAPA.Dominio;
using CREAPA.Dominio.contrato;
using CREAPA.Repositorio;

namespace CREAPA.RepositorioADO
{
    public class PortariaRepositorioADO
    {
        private Contexto contexto;

        public string Inserir(Portaria portaria)
        {
            portaria.Descricao = portaria.Descricao.Replace("'", "");
            var strQuery = "";
            strQuery += " INSERT INTO Portaria (Descricao, DataPortaria, Ano, IdTipoPortaria, IdAssuntoPortaria)";
            strQuery += string.Format(" values ('{0}', '{1}', {2}, {3}, {4})",
            portaria.Descricao, portaria.DataPortaria, portaria.Ano, portaria.IdTipoPortaria, portaria.IdAssuntoPortaria);

            strQuery += "insert into SituacaoPortaria(Descricao,Data,IdPortaria,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", "Cadastro da Portaria", "GETDATE()", "(select MAX(id) from Portaria)", 1, portaria.PessoaCadastrou);

            strQuery += string.Format(" select MAX(id) retorno from Portaria ");
            using (contexto = new Contexto())
            {
                return contexto.ExecutaComandoComRetorno1Campo(strQuery);
            }
        }

        public string Analisar(Portaria portaria)
        {
            var strQuery = "";
            int sitPortaria = 0;
            strQuery += "UPDATE Portaria SET ";

            if (portaria.Analisado_Superintendencia == false)//Analise da Superintendencia
            {
                strQuery += string.Format("Analisado_Superintendencia = '{0}',", 1);
                strQuery += string.Format("PendenciaCadastro = {0},", portaria.PendenciaCadastro == false ? 0 : 1);
                sitPortaria = 2;//Analisada
            }
            else if (portaria.Analisado_Superintendencia == true && portaria.PendenciaCadastro == false)//Análise da presidência
            {
                strQuery += string.Format("Numero = {0},", "(select isnull(MAX(Numero),0)+1 from Portaria where Ano=" + portaria.Ano + ")");
                strQuery += string.Format("Analisado_Presidencia = '{0}',", 1);
                strQuery += string.Format("PresidenteAssinou = '{0}',", portaria.PresidenteAssinou);
                sitPortaria = 6;//Concluida
                //Justifica a Descricao da portaria
                portaria.Descricao = portaria.Descricao.Replace("'", "");
                portaria.Descricao = portaria.Descricao.Replace("<p>", "<p align=\"justify\">");
                portaria.Descricao = portaria.Descricao.Replace("<p style=\"text-align:justify\">", "<p align=\"justify\">");
            }
            else if (portaria.Analisado_Superintendencia == true && portaria.PendenciaCadastro == true)//Correção FUNC
            {
                strQuery += string.Format("Analisado_Presidencia = '{0}',", 1);
                strQuery += string.Format("Analisado_Superintendencia = '{0}',", 1);
                strQuery += string.Format("PendenciaCadastro = {0},", 1);
                sitPortaria = 2;//Analisada
            }
            
            strQuery += string.Format(" IdTipoPortaria = '{0}',", portaria.IdTipoPortaria);
            strQuery += string.Format(" IdAssuntoPortaria = '{0}',", portaria.IdAssuntoPortaria);
            strQuery += string.Format(" DataPortaria = '{0}',", portaria.DataPortaria);
            strQuery += string.Format(" Descricao = '{0}'", portaria.Descricao);
            strQuery += string.Format(" WHERE Id = {0};", portaria.Id);

            strQuery += "insert into SituacaoPortaria(Descricao,Data,IdPortaria,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", portaria.DescricaoAnalise, "GETDATE()", portaria.Id, sitPortaria, portaria.PessoaCadastrou);

            strQuery += string.Format("select Numero retorno from Portaria where id={0}", portaria.Id);
     

            using (contexto = new Contexto())
            {
                return contexto.ExecutaComandoComRetorno1Campo(strQuery);
            }
        }


        private void Alterar(Portaria portaria)
        {
            portaria.Descricao = portaria.Descricao.Replace("'", "");
            int sitPortaria = 5;
            var strQuery = "";
            strQuery += "UPDATE Portaria SET ";
            strQuery += string.Format("Analisado_Presidencia = '{0}',", 0);
            strQuery += string.Format("Analisado_Superintendencia = '{0}',", 0);
            strQuery += string.Format("PendenciaCadastro = {0},", 0);
            strQuery += string.Format(" Descricao='{0}', ", portaria.Descricao);
            strQuery += string.Format(" DataPortaria = '{0}',", portaria.DataPortaria);
            strQuery += string.Format(" Ano='{0}', ", portaria.Ano);
            strQuery += string.Format(" IdTipoPortaria='{0}', ", portaria.IdTipoPortaria);
            strQuery += string.Format(" IdAssuntoPortaria = '{0}',", portaria.IdAssuntoPortaria);
            strQuery += string.Format(" PresidenteAssinou='{0}' ", portaria.PresidenteAssinou);
            strQuery += string.Format(" WHERE Id={0} ", portaria.Id);

            strQuery += "insert into SituacaoPortaria(Descricao,Data,IdPortaria,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", portaria.DescricaoAnalise, "GETDATE()", portaria.Id, sitPortaria, portaria.PessoaCadastrou);
            using (contexto = new Contexto())
            {
                contexto.ExecutaComando(strQuery);
            }
        }

        public void Salvar(Portaria portaria)
        {
            if (portaria.Id > 0)
            {
                Alterar(portaria);
            }
            else
            {
                Inserir(portaria);
            }
        }

        public void Excluir(int id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = string.Format(" DELETE FROM SituacaoPortaria where IdPortaria={0}; DELETE FROM Portaria WHERE Id = {0}; ", id);
                contexto.ExecutaComando(strQuery);
            }
        }

        public Portaria ListarPorId(string Id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT p.*, null CargoPresidente, s.PessoaCadastrou, null DescricaoAnalise FROM Portaria p" +
                " inner join  SituacaoPortaria s on p.Id=s.IdPortaria and s.IdTipoSituacao=1 WHERE p.Id = {0}", Id);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader).FirstOrDefault();
            }
        }

        public Portaria ListarDescPorId(string Id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT p.Id, p.Descricao, p.Numero, p.Ano, p.DataPortaria, t.Descricao IdTipoPortaria, a.Descricao IdAssuntoPortaria, p.Analisado_Presidencia," +
                " p.Analisado_Superintendencia, p.PendenciaCadastro, p.PresidenteAssinou, null CargoPresidente, null DescricaoAnalise, s.PessoaCadastrou FROM Portaria p" +
                " inner join  SituacaoPortaria s on p.Id=s.IdPortaria and s.IdTipoSituacao=1" +
                " inner join AssuntoPortaria a on a.id=p.IdAssuntoPortaria"+
                " inner join TipoPortaria t on p.IdTipoPortaria=t.Id WHERE p.Id = {0}", Id);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader).FirstOrDefault();
            }
        }

        public Portaria ListarImprimir(string Id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT p.id,p.Descricao, p.Numero, p.Ano, p.DataPortaria, PessoaCadastrou, tp.Descricao IdTipoPortaria," +
                    " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia, Analisado_Presidencia, PendenciaCadastro, ps.Nome PresidenteAssinou," +
                    " c.Nome CargoPresidente, null PendenciaCadastro, null DescricaoAnalise FROM Portaria p inner join  Funcionario f on p.PresidenteAssinou=f.Login" +
                    " inner join AssuntoPortaria a on a.Id=p.IdAssuntoPortaria " +
                    " inner join TipoPortaria tp on tp.Id=p.IdTipoPortaria inner join Pessoa ps on ps.Id=f.IdPessoa" +
                    " inner join SituacaoPortaria s on p.Id=s.IdPortaria and s.IdTipoSituacao=1" +
                    " inner join Cargo c on c.Id=f.IdCargo WHERE p.Id = {0}", Id);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader).FirstOrDefault();
            }
        }

        public Portaria EmailFuncPortaria(int Id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" select p.Email PessoaCadastrou, 0 id, null descricao, null numero, 0 ano, null dataPortaria, "+
                    " null IdTipoPortaria, null IdAssuntoPortaria, null PresidenteAssinou, null Analisado_Superintendencia, null Analisado_Presidencia, " +
                    " null CargoPresidente, null DescricaoAnalise, null PendenciaCadastro from Funcionario f inner join Pessoa p on p.Id=f.IdPessoa" +
                    " where f.Login=(select PessoaCadastrou from SituacaoPortaria where IdPortaria= {0} and IdTipoSituacao=1) ", Id);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader).FirstOrDefault();
            }
        }

        public IEnumerable<Portaria> ListarPortariasPendente(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Numero,o.Ano,o.Descricao,o.DataPortaria, p.Descricao IdTipoPortaria," +
                " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia,Analisado_Presidencia,null PresidenteAssinou, null PessoaCadastrou," +
                " null CargoPresidente, PendenciaCadastro,(select  top 1 Descricao from SituacaoPortaria so" +
                " where IdPortaria=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise" +
                " FROM Portaria o inner join TipoPortaria p on o.IdTipoPortaria=p.Id inner join AssuntoPortaria a on a.Id=o.IdAssuntoPortaria" +
                " inner join SituacaoPortaria s on o.Id=s.IdPortaria and s.IdTipoSituacao=1" +
                " WHERE (PessoaCadastrou = '{0}') and (Analisado_Presidencia=1 or Analisado_Superintendencia=1) and PendenciaCadastro=1  order by o.Id desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }
        public IEnumerable<Portaria> ListarPortariaEmTramite(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Numero,o.Ano,o.Descricao,o.DataPortaria, p.Descricao IdTipoPortaria," +
                " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia,Analisado_Presidencia,null PresidenteAssinou, null PessoaCadastrou," +
                " null CargoPresidente, PendenciaCadastro,(select  top 1 Descricao from SituacaoPortaria so" +
                " where IdPortaria=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise" +
                " FROM Portaria o inner join TipoPortaria p on o.IdTipoPortaria=p.Id inner join AssuntoPortaria a on a.Id=o.IdAssuntoPortaria" +
                " inner join SituacaoPortaria s on o.Id=s.IdPortaria and s.IdTipoSituacao=1" +
                " WHERE (PessoaCadastrou = '{0}') and (Analisado_Presidencia=0 or Analisado_Superintendencia=0) and PendenciaCadastro=0  order by o.Id desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }
        public IEnumerable<Portaria> ListarPortariasImprimir(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Numero,o.Ano,o.Descricao,o.DataPortaria, p.Descricao IdTipoPortaria," +
                " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia,Analisado_Presidencia,null PresidenteAssinou, null PessoaCadastrou," +
                " null CargoPresidente, PendenciaCadastro,(select  top 1 Descricao from SituacaoPortaria so" +
                " where IdPortaria=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise" +
                " FROM Portaria o inner join TipoPortaria p on o.IdTipoPortaria=p.Id inner join AssuntoPortaria a on a.Id=o.IdAssuntoPortaria" +
                " inner join SituacaoPortaria s on o.Id=s.IdPortaria and s.IdTipoSituacao=1" +
                " WHERE (PessoaCadastrou = '{0}') and Analisado_Presidencia=1 and Analisado_Superintendencia=1 and PendenciaCadastro=0  order by o.Id desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }


        public IEnumerable<Portaria> ListarPortariasPesquisa(Portaria portaria)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Numero,o.Ano,o.Descricao,o.DataPortaria, p.Descricao IdTipoPortaria," +
                " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia,Analisado_Presidencia,null PresidenteAssinou, ps.Nome PessoaCadastrou," +
                " null CargoPresidente, PendenciaCadastro,null DescricaoAnalise" +
                " FROM Portaria o inner join TipoPortaria p on o.IdTipoPortaria=p.Id inner join AssuntoPortaria a on a.Id=o.IdAssuntoPortaria" +
                " inner join SituacaoPortaria s on o.Id=s.IdPortaria and s.IdTipoSituacao=6" +
                " inner join SituacaoPortaria st on o.Id=st.IdPortaria and st.IdTipoSituacao=1" +
                " inner join Funcionario f on f.Login=st.PessoaCadastrou " +
                " inner join Pessoa ps on ps.Id=f.IdPessoa " +
                " WHERE Analisado_Presidencia=1 and Analisado_Superintendencia=1 and PendenciaCadastro=0");

                if (portaria.Numero != null)
                    strQuery += string.Format(" and o.Numero= '{0}'", portaria.Numero);

                if (portaria.DataPortaria != null)
                    strQuery += string.Format(" and Convert(varchar(10),o.DataPortaria,103) = '{0}'", portaria.DataPortaria);
                else//Em todos as pesquisas considera o ano, exceto na data
                    strQuery += string.Format(" and o.Ano = '{0}'", portaria.Ano);

                if (portaria.IdTipoPortaria != null)
                    strQuery += string.Format(" and o.IdTipoPortaria = '{0}'", portaria.IdTipoPortaria);

                if (portaria.IdAssuntoPortaria != null)
                    strQuery += string.Format(" and o.IdAssuntoPortaria = '{0}'", portaria.IdAssuntoPortaria);

                strQuery += "  order by o.Ano desc,o.Numero desc";



                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        public IEnumerable<Portaria> ListarPorFuncionario(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Numero,o.Ano,o.Descricao,o.DataPortaria, p.Descricao IdTipoPortaria, " +
            " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia,Analisado_Presidencia,null PresidenteAssinou, null PessoaCadastrou, null CargoPresidente, PendenciaCadastro, " +
            " (select  top 1 Descricao from SituacaoPortaria so where IdPortaria=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise " +
            " FROM Portaria o inner join TipoPortaria p on o.IdTipoPortaria=p.Id inner join AssuntoPortaria a on a.Id=o.IdAssuntoPortaria " +
            " inner join SituacaoPortaria s on o.Id=s.IdPortaria and s.IdTipoSituacao=1" +
            " WHERE (PessoaCadastrou = '{0}') and (Analisado_Presidencia=0 or Analisado_Superintendencia=0) order by o.Id desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        public IEnumerable<Portaria> ListarPortariasPend(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Numero,o.Ano,o.Descricao, s.Data DataPortaria,p.Descricao IdTipoPortaria, " +
            " a.Descricao IdAssuntoPortaria, Analisado_Superintendencia,Analisado_Presidencia,null PresidenteAssinou, null CargoPresidente, PendenciaCadastro," +
            " (select  top 1 Descricao from SituacaoPortaria so where IdPortaria=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise, " +
            " (select top 1 PessoaCadastrou from SituacaoPortaria so where IdPortaria=o.id and so.IdTipoSituacao=1)PessoaCadastrou " +
            " FROM Portaria o inner join TipoPortaria p on o.IdTipoPortaria=p.Id inner join AssuntoPortaria a on a.Id=o.IdAssuntoPortaria " +
            " inner join SituacaoPortaria s on o.Id=s.IdPortaria and s.IdTipoSituacao=1" +
            "   WHERE (PendenciaCadastro=0 and Analisado_Superintendencia=0 and  '{0}' in" +
            "  (select Login from Funcionario f inner join Setor s on f.IdSetor=s.Id where s.Id=16" +
            " 		union select Login from FuncionarioSetor where setor=16))" +
            " or (PendenciaCadastro=0 and Analisado_Superintendencia=1 and Analisado_Presidencia=0 and  '{0}' in" +
            "  (select Login from Funcionario f inner join Setor s on f.IdSetor=s.Id where s.Id=68" +
            " 		union select Login from FuncionarioSetor where setor=68))   " +
             "   order by o.Id", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        private List<Portaria> TransformaReaderEmListaDeObjeto(SqlDataReader reader)
        {
            var portaria = new List<Portaria>();
            while (reader.Read())
            {
                var TemObjeto = new Portaria()
                {
                    Id = int.Parse(reader["Id"].ToString()),
                    Descricao = reader["Descricao"].ToString(),
                    Numero = reader["Numero"].ToString(),
                    Ano = int.Parse(reader["Ano"].ToString()),
                    DataPortaria = reader["DataPortaria"].ToString(),
                    PessoaCadastrou = reader["PessoaCadastrou"].ToString(),
                    IdTipoPortaria = reader["IdTipoPortaria"].ToString(),
                    IdAssuntoPortaria = reader["IdAssuntoPortaria"].ToString(),
                    PresidenteAssinou = reader["PresidenteAssinou"].ToString(),
                    Analisado_Presidencia = bool.Parse(reader["Analisado_Presidencia"] != DBNull.Value ? reader["Analisado_Presidencia"].ToString() : "false"),
                    Analisado_Superintendencia = bool.Parse(reader["Analisado_Superintendencia"] != DBNull.Value ? reader["Analisado_Superintendencia"].ToString() : "false"),
                    CargoPresidente = reader["CargoPresidente"].ToString(),
                    DescricaoAnalise = reader["DescricaoAnalise"].ToString(),
                    PendenciaCadastro = bool.Parse(reader["PendenciaCadastro"] != DBNull.Value ? reader["PendenciaCadastro"].ToString() : "false"),
                };
                portaria.Add(TemObjeto);
            }
            reader.Close();
            return portaria;
        }
    }
}






